package com.heima.common.autoconfig;

import com.heima.common.autoconfig.properties.MinIOProperties;
import com.heima.common.autoconfig.template.MinIOTemplate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;

/**
 * 自动装配, 就是自动创建目标对象,交给spring容器管理; 像mysql,redis
 * 步骤:
 * 1. 导入目标的pom
 * 2. 写配置文件
 * 3. 写配置类,像mybatis就需要数据库连接配置
 * 4. 定义目标核心功能,方便后面使用
 * 5. 通过 @EnableConfigurationProperties() 导入配置文件,创建该目标的核心对象,
 * 交给spring容器管理
 * 6. 修改 META-INF/spring.factories文件, 添加该目标的自动配置类
 * 7. @SpringBootApplication -> @EnableAutoConfiguration -> @Import({AutoConfigurationImportSelector.class})
 * @Import({EnableConfigurationPropertiesRegistrar.class}) 这两个没怎么看懂, 我只知道是扫描器, 扫描factories文件的
 * 在分析AutoConfigurationImportSelector的源码时，会先扫描spring-autoconfiguration-metadata.properties文件，最后在
 * 扫描spring.factories对应的类时，会结合前面的元数据进行过滤，为什么要过滤呢？ 原因是很多的@Configuration其实是依托于其他的
 * 框架来加载的，如果当前的classpath环境下没有相关联的依赖，则意味着这些类没必要进行加载，所以，通过这种条件过滤可以有效的减
 * 少@configuration类的数量从而降低SpringBoot的启动时间。
 * 8. @ConditionalOnProperty, @ConditionalOn 这种是条件注解, 满足什么条件才会自动装配
 */
@EnableConfigurationProperties({MinIOProperties.class})
public class LeadNewsAutoconfig {

    @Bean
    // 如果配置文件中有 minio.enable 属性,且值为true, 代表该方法会执行,否则不会执行
    @ConditionalOnProperty(prefix = "minio", value = "enable", havingValue = "true")
    public MinIOTemplate minIOTemplate(MinIOProperties minIOProperties) {
        return new MinIOTemplate(minIOProperties);
    }
}
